#ifndef SESSIONFRIENDAREA_H
#define SESSIONFRIENDAREA_H

#include <QWidget>
#include <QScrollArea>
#include <QGridLayout>
#include <QLabel>
#include <QMouseEvent>
#include <QEnterEvent>

/*
 * 滚动区域中 Item 的类型
*/

enum ItemType{
    SessionItemType,
    FriendItemType,
    ApplyItemType
};

//QScrollArea 实现滚动区
class SessionFriendArea : public QScrollArea
{
    Q_OBJECT
public:
    explicit SessionFriendArea(QWidget *parent = nullptr);

    //清空所有元素
    void clear();

    // 向container中添加元素,此处的ItemType 代表要添加那种Item，id跟着不同的itemtype 有不同的含义
    void addItem(ItemType itemType,const QString& id,const QIcon& avatar,const QString& name,const QString& text);
    //选中某个指定的Item，通过index下标来进行选择
    void clickItem(int index);

private:
    //向container 中添加元素的时候，就可以出发滚动效果
    QWidget* container;

signals:
};


/*
 *  滚动区域中的Item实现
*/
class SessionFriendItem : public QWidget
{

public:
    SessionFriendItem(QWidget* owner,const QIcon& avatar,const QString& name,const QString& text);
    //官网文档中给出的要求，如果一个子类继承自widget,那么要将背景颜色生效，需要重写paintEvent
    void paintEvent(QPaintEvent *event) override;
    //当点击会话的时候，颜色加深，其余恢复原样
    void mousePressEvent(QMouseEvent* event) override;
    //鼠标还没有点击，只是在哪个QWidget中，将颜色变深
    void enterEvent(QEnterEvent* event) override;
    //鼠标离开哪个QWidget时，将颜色恢复
    void leaveEvent(QEvent* event) override;

    void select(QMouseEvent* event);
    virtual void active();

private:
    //这个指针指向了SessionFriendArea对象的指针
    QWidget* owner;

    //用来判断Item是否被选中
    bool selected = false;



protected:
    //最后一条消息
    QLabel* messageLabel;
};

//聊天会话
class SessionItem : public SessionFriendItem
{
    Q_OBJECT
public:
    SessionItem(QWidget* owner,const QString& chatSessionId,const QIcon& avatar,const QString& name,const QString& lastMessage);
    //点击之后，要在主界面右侧显示区中加载出对应的消息列表
    void active() override;

    void updateLastMessage(const QString &chatSessionId);
private:
    // 当前会话Id
    QString chatSessionId;

    // 最后一条消息的文本预览
    QString text;
};

//好友会话
class FriendItem : public SessionFriendItem
{
    Q_OBJECT
public:
    FriendItem(QWidget* owner,const QString& userId,const QIcon& avatar,const QString& name,const QString& description);
    //点击之后，要切换会话列表，并且选中对应的回话
    void active() override;
private:
    QString userId;
};

//好友申请会话
class ApplyItem : public SessionFriendItem
{
    Q_OBJECT
public:
    ApplyItem(QWidget* owner,const QString& userId,const QIcon& avatar,const QString& name);
    //点击之后，没有什么事 主要看接受 和 拒绝按钮 来操作
    void active() override;

    // 同意好友申请
    void acceptFriendApply();
    // 拒绝好友申请
    void rejectFriendApply();
private:
    QString userId;
};


#endif // SESSIONFRIENDAREA_H
